package qgs.zisu.javaconcurrency.javaconcurrency.chapter10_LockTrick;

import java.util.ArrayList;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * @Author: 蔡翔
 * @Date: 2019/10/18 21:17
 * @Version 1.0
 *
 * 自定义锁的实现和使用
 */
public class LOCKTest {
    public static void main(String[] args) throws Exception {
        final BoolenLock boolenLock = new BoolenLock();
        Stream.of("T1","T2","T3","T4")
                .forEach(name->new Thread(()->{
            try {
                //从这个锁出来以后，就放弃了这个锁。
                //给下面要执行的代码 加一个锁（限制时间），如果超时了，那我就做后续的工作，这个工作我暂时不作了。
                boolenLock.lock(10);
                Optional.of(Thread.currentThread().getName()+"have the lock monitor")
                        .ifPresent(System.out::println);
                work();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }catch (LOCK.TimeOutException t){
                // 一定要lock() 方法可以抛出异常，这里才能不作。
                System.out.println();
                Optional.of(Thread.currentThread().getName()+"Time out")
                        .ifPresent(System.out::println);
            }
            finally {
                boolenLock.unlock();
            }
        },name).start());

        //问题： 这个锁可能存在一个bug，可能外部可以随意的调用 unlock 锁。对现有的等待队列产生影响
        //解决方案：谁家的锁只能由谁去释放。
/*        Thread.sleep(100);
        boolenLock.unlock();*/
    }

    //线程要进行的工作
    private static void work() throws InterruptedException{
        Optional.of(Thread.currentThread().getName()+"is working,,,")
        .ifPresent(System.out::println);
        Thread.sleep(10000);
    }
}
